% 例6.12 JPEG图像压缩典型算法。
fxy=imread("img/lena.bmp");
subplot(2,2,1),imshow(fxy),xlabel("(a)原始图像");

fxy=im2double(fxy);
H=dctmtx(8);%产生8*8的DCT变换矩阵

Fuv1=blkproc(fxy,[8 8],'P1*x*P2',H,H');%分块进行DCT变换
mask1=[ 1 1 0 0 0 0 0 0
        1 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        ];%二值掩膜，用于压缩DCT系数
Fuv1=blkproc(Fuv1,[8,8],'P1.*x',mask1);%仅保留DCT系数左上角的3个系数
fxy1=blkproc(Fuv1,[8,8],'P1*x*P2',H',H);%分块进行逆DCT变换
subplot(2,2,2),imshow(fxy1,[]),xlabel("(b)重构图像(保留左上角的3个幅度谱)");

Fuv2=blkproc(fxy,[8,8],'P1*x*P2',H,H');  %分块进行DCT变换
mask2=[ 1 1 1 0 0 0 0 0
        1 1 0 0 0 0 0 0
        1 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        ];%二值掩膜，用于压缩DCT系数
Fuv2=blkproc(Fuv2,[8,8],'P1.*x',mask2);%仅保留DCT系数左上角的6个系数
fxy2=blkproc(Fuv2,[8,8],'P1*x*P2',H',H);%分块进行逆DCT变换
subplot(2,2,3),imshow(fxy2,[]),xlabel("(c)重构图像(保留左上角的6个幅度谱)");

Fuv3=blkproc(fxy,[8,8],'P1*x*P2',H,H');  %分块进行DCT变换
mask3=[ 1 1 1 1 0 0 0 0
        1 1 1 0 0 0 0 0
        1 1 0 0 0 0 0 0
        1 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        ];%二值掩膜，用于压缩DCT系数
Fuv3=blkproc(Fuv3,[8,8],'P1.*x',mask3);%仅保留DCT系数左上角的6个系数
fxy3=blkproc(Fuv3,[8,8],'P1*x*P2',H',H);%分块进行逆DCT变换
subplot(2,2,4),imshow(fxy3,[]),xlabel("(d)重构图像(保留左上角的10个幅度谱)");





